In Revolution this works flawlessly with the new parsing engine, but in Evolution you have to make sure the order of execution is correct.
For example, when embedding your ParentList tag in the Ditto tag, you need to make sure that ParentList is executed before Ditto is. In Evo, in order to do this, you must call Ditto uncached and the ParentList tag cached, e.g.
[!Ditto? &parents=`[[ParentList? &treeroot=`15` ]]` ......... !]
This is because Ditto does not know how to interpret the parents property if it is a tag still when Ditto is executed. In Revo this is not a problem; the new parser respects the order of embedded tags and processes them before processing the containing tag. This was one of the major motivations for the Revolution project.