I'd say for two reasons. One is that you're making one trip across the wire, not a couple hundred as you loop through the outer recordset to get the "child" and "grandchild" records - I'll grant there are way to do it fairly efficiently without shaping, but I think a lot of people do it badly and shaping is a nice way to get it done efficiently.
The other is that sometimes you really are working with a hierarchy and it's nice to work with it that, both conceptually and practically. For those of you not familiar with it child records are contained in a recordset that appears as a "field" in the main/parent recordset where it has a field type of....136 I think.
So lets forget the shape syntax for a minute, just think of the stereotypical order/order detail situation - we want to get all the orders from yesterday and all the details. Once we get that into a shaped recordset, it might look like this:
do until rsOrderInfo.eof
debug.print rsOrderInfo.OrderID, rsOrderInfo.Status, blah, blah
do until rstemp.eof
debug.print rsTemp!Qty, rsTemp!Description
I'm not an XML guy (that's Leon!), and I think that the shape syntax is far cleaner than the FOR XML with the EXPLICIT option. It also lets me skip the XML DOM learning curve. I think probably a good compromise if you need XML is to retrieve using Shape, then apply a transform to the XML generated by the recordset.
We were flat stunned when we found out we were bringing over tons more data than we needed - but it makes sense if you think about it!