Dear Sukruti,
Please see the attached notebook. Some comments below: one major, a few minor.
The most important comment is that you should not define a tensor T with DefTensor and then create a definition along the lines of
T[a_, b_] := ... (1)
The reason is that a definition like (1) means Mma will *always* replace T[...] with some other expression, and thus there will never be an abstract T[indices] around. We want to keep the abstract T, not replace it with a different expression. This is a very common misunderstanding in xTensor. If you *do* want to do something like (1) — always replacing T[indices] with a different expression — then there is no need to use DefTensor. It's possible to have the best of both worlds: make replacement rules, either manually or with MakeRule. That way, you can manipulate the abstract T[indices] until the point where you want to actually replace it with a different expression. This is demonstrated in the attached notebook.
More minor comments. This is of course only possible in dimension 4, but there are other dimension-specific things in xTensor, so it would be possible to automate this. Next, since we do use DefTensor, we should tell it all the symmetries. The left and right duals of Riemann only have antisymmetry in each pair, without the exchange symmetry, so we have to create the "generating set" for this symmetry ourselves instead of using RiemannSymmetric or a simpler symmetry like Symmetric[] or Antisymmetric[]. Finally, keep in mind that ToCanonical and therefore AllContractions are not aware of multiterm symmetries. You can see in the last line of the notebook that some of the expressions that come out of the computation are automatically vanishing because of R_{[abc]d} = 0, which also implies that traces of the dual Riemann tensor vanish. But, nothing in xTensor knows about this. So, you still have to guide the calculation after this point if you want to make use of multiterm symmetries.
Best
Leo