here's my 2 cents.
suppose i have two vector spaces (say X and Y) and a linear map f:X->Y
then you automatically get a map f*:Y*->X*
usually called the transpose or pullback. it's defined in the obvious way. let ω in Y*
then (f*ω)(x) = ω(fx).
if we have an inner product on X and Y we have an identification of X*
with X and Y* with Y. we can use this to define the transpose map
fT: Y ->X.
Specifically, define θ:X->X* by (θx)(x') = (x,x') for all x' in X.
similarly let ψ:Y->Y* {(ψy)(y')=(y,y')}. We put
fT = θ-1f*ψ.
or θfT = f*ψ.
then for any y we have
θfT(y) = f*ψ(y)
both sides are elements of X* so that we can compare them
by their action on an arbitrary x in X
θfT(y)[x] = (fTy, x)
f*ψ(y)[x] = ψ(y)( fx ) = (y, fx)
so we have a coordinate independent definition of transpose for
a map between two inner product spaces.
Take a basis for X and Y.
And find the components of any map f:X->Y by
(fx)i = fij xj
we have
(y, fx) = gijyi(fx)j = gijyifjkxk
and(fTy, x) = Gij(fTy)ixj= Gij(fT)ikykxj.
Reindex the dummy variables and compare:
gijfjk = Gjk(fT)ji.
or using the convention that the inverse of G has components Gij
(fT)ij = gjkfklGli.
using the convention that g (or G) raises or lowers indices we have
(fT)ij = fji.
-----------------------
This is just a longwinded way to say
gijfjk = Gjk(fT)ji is the same as fik = (fT)ki,
then make indices match on both sides of the equation.