Hi Fabien,
here is another approach, possible for every dimension and general functions without known number of variables or functionnames
Transposelike[expr_] :=
Block[ {numberm, numbern, numbermn},
numberm = Length[Level[expr, {1}]];
numbermn = Length[Level[expr, {2}]];
numbern = numbermn/numberm;
expr[[1]][[0]] @@ Head[expr] @@@ Transpose[Partition[ Level[expr, {2}] , numbern]];];
Here is a result
expr = f[g[a, b], g[c, d], g[e, h], g[i, j]];
gives
g[f[a, c, e, i], f[b, d, h, j]]
and
f[x_, y_, z_, r_] := x y z r; g[x_, y_] := x + y;
expr = f[g[a, b], g[c, d], g[e, h], g[i, j]];
leads to
a c e i + b d h j