Here's what I think you want:
ClearAll[d, g, L];
d[f_] := x D[f, x]
g[x_] := 2 x
L[f_] := g[x] Nest[d, f, 4]
exL = Evaluate[Expand[L[#[x]]]] & /.
Derivative[k_][#][x] :> D[#, {x, k}]
The replacement Derivative[k_][#][x] :> D[#, {x, k}] changes the argument # from representing a pure function to representing an expression. This seemed unavoidable because if we had used L[#], then D[#, x] would be zero; but in L[#[x]], D[#[x], x] would be correct.
If you want the coefficients:
Block[{D = $f^#2[[2]] &},
CoefficientList[First@exL, $f]
]
{0, 2 x^2, 14 x^3, 12 x^4, 2 x^5}
Compare applications:
L[Exp[a x]] // Expand
exL[Exp[a x]]
Here's a refactoring with the parameters as arguments:
ClearAll[d, g, L];
d[x_][f_] := x D[f, x]
L[f_, g_, x_] := g Nest[d[x], f, 4]
exL = Evaluate@Expand[L[#[x], g[x], x]] & /.
Derivative[k_][#][x] :> D[#, {x, k}]
d[f_] := # Derivative[1][f][#] &. – b.gates.you.know.what Feb 04 '20 at 13:28