Hi Jackson,
I think I can answer some of your questions. Some of it boils down to which indices are being used (the fact that tensors may now take indices in multiple VBundles is messy...).
You noticed that when you take a Christoffel from a product metric and use ExpandProductMetric, it is expanded into some derivatives when the indices come from different VBundles but in the situation when all three indices come from the same VBundle, it spits out another Christoffel symbol (appropriate to whatever indices it has). However when you say that the resulting Christoffel should vanish, this is not true—you have declared a metric which has not curvature, but the connection is still general (i.e. you can use polar coordinates on flat space and you need a nonvanishing Christoffel). This is why some of your expressions which you expected to vanish do not vanish.
If you want, you can tell DefMetric that FlatMetric->True and also tell it to use PD as connection. Then it will indeed make the Christoffel vanish.
Later in your notebook you use some expressions where there are contracted (dummy) indices which are from the product manifold. If you want to use ExpandProductMetric with those expressions and get the metric replaced properly, you will need to first use TraceProductDummy. For example, you can run
ChristoffelCDpq[i, -j, -k] // ChristoffelToMetric // TraceProductDummy
ExpandProductMetric[%, metricpq]
and get the expected result.
One-dimensional manifolds in xTensor sometimes have some issues (the canonicalizer tries to treat them specially but this causes problems with product manifolds). I don't exactly remember the status of 1d manifolds right now ... maybe only Jose remembers :)
If you want a symbolic dimension, you must tell xTensor that a symbol is a ConstantSymbol, e.g.
DefConstantSymbol[p]
DefManifold[Mp, p, {mu, nu, ...} ]
Hope this helps!
Cheers
Leo