Here you have a (rather inefficient) piece of code:
l = {a, b, c, d};
r = ReplaceList[Range@Length@l, {a___, x_, y_, b___} -> {a, y, x, b}];
g = Quiet@Graph[
DeleteDuplicates@(Flatten[(UndirectedEdge[x, #] & /@ Function[t, Map[t[[#]] &, r, {2}]][x])
/. x -> # & /@ Permutations@l, 1] /. UndirectedEdge[x_, x_] -> Sequence @@ {}) //.
{a___, UndirectedEdge[x_, y_], b___, UndirectedEdge[y_, x_], c___} ->
{a, UndirectedEdge[x, y], b, c}]

And now:
s = FindShortestPath[g, {a, b, c, d}, {d, b, c, a}]
(*{{a, b, c, d}, {b, a, c, d}, {b, c, a, d}, {b, c, d, a}, {b, d, c, a}, {d, b, c, a}}*)
I am sure this is the worst possible approach
Now, for finding the transpositions used
Partition[s, 2, 1] /. {{a___, b_, c_, d___}, {a___, c_, b_, d___}} -> {b, c}
(*{{a, b}, {a, c}, {a, d}, {c, d}, {b, d}}*)
Edit
Uglier but much faster
swap[l_, j_] := Sequence @@@ {l[[1 ;; j - 1]], l[[j + 1]], l[[j]], l[[j + 2 ;;]]}
w[l_] := Module[{sw, i},
For[i = 1, i < Length@l, i++,
sw = swap[l, i];
If[! MemberQ[k, UndirectedEdge[l, sw]] && ! MemberQ[k, UndirectedEdge[sw, l]],
AppendTo[k, UndirectedEdge[l, sw]]];
If[! MemberQ[t, sw], AppendTo[t, sw]; w[sw]]
];
];
l = {a, b, c, d, e};
k = {};
t = {l};
Block[{$RecursionLimit = 1000}, w[l]];
pg = Graph@k;
s = FindShortestPath[pg, {a, b, c, d, e}, {d, b, e, c, a}]
Edit
Just boasting, a 3D plot of the permutations:
Needs["GraphUtilities`"]
pg3 = GraphPlot3D@g;
coord = GraphCoordinates3D[EdgeList@g /. UndirectedEdge -> Rule];
Thread[VertexList[g] -> coord];
Animate[GraphPlot3D[g, VertexCoordinateRules -> coords,
VertexRenderingFunction -> ({Sphere[#1, 0.2]} &),
EdgeRenderingFunction -> (Cylinder[#1, 0.1] &), Boxed -> False,
ViewPoint -> RotationMatrix[x, {0, 0, 1}].{1.3, -2.4, 2},
SphericalRegion -> True], {x, 0, 2 Pi, 2 Pi/20}]

{-i, f}and{i, f}swaps since there is not anfelement in your original list – belisarius Sep 20 '12 at 13:15