What you can do, and I have done as well for my project is to extend the player and create my own generic.xaml that it uses as the default template. I have a custom player class that exposes 5 new template parts and some new visual states. In the constructor
of the custom player I set the DefaultStyleKey to the type of my class and that points to the version in my themes/generic.xaml.
Doing this I can control the display by code still and have my new parts in there.
Finding the grid via code just takes walking the visual tree.
That should work to find the grid
player.GetVisualAncestors().Where(x => x is Grid && ((Grid) x).Name == "ControllerContainer ").FirstOrDefault();