Resolved. For future reference, should anyone need the solution, the macro follows.
It uses 2 reports - the final one and a 'working report' to hold the list of parent categories. This is cycled through to move the cursor on the final report. It is also used to add the child categories to the category list object, which are then placed under the active row on the main report.
I have not bothered to put in the quit and save for the associated reports.
Sub Main()
Dim objCubeCategories As Object
Dim Morcats as Object
Dim objDimensionLine as Object
Dim cat1 as Object
Dim objPPRep As Object
Dim PPRep2 as Object
Dim ObjCubeCat1 as Object
Const level_0 = 0
Const level_1 = 1
Const add_to_current = 0
Const add_to_all = 1
Const as_parent = 0
Const as_child = 1
Dim Rowcount as Integer
Set objPPRep = CreateObject("CognosPowerPlay.Report"

objPPRep.New "C:\Program Files\Cognos\cer2\Samples\PowerPlay\Cubes and Reports\Great Outdoors.mdc", -1
objPPRep.ExplorerMode = False
objPPRep.Visible = True
Set PPRep2 = CreateObject("CognosPowerPlay.Report"

PPRep2.New "C:\Program Files\Cognos\cer2\Samples\PowerPlay\Cubes and Reports\Great Outdoors.mdc", -1
PPRep2.ExplorerMode = False
PPRep2.Visible = True
PPRep2.Rows.Select
PPRep2.DeleteSelected
PPRep2.Columns.Select
PPRep2.DeleteSelected
Set morcats = PPRep2.CategoryList()
Morcats.Add 1,"Years"
PPRep2.Rows.Add morcats
Set objCubeCategories = objPPRep.CategoryList()
Set Morcats = objPPRep.CategoryList()
PPRep2.Rows.Add Morcats
Rowcount = PPRep2.Rows.Count()
for t = 1 to rowcount
rowname = PPRep2.Rows.Item(t).Name
objPPRep.Rows.Item(rowname).Activate
objCubeCategories.Add 2,"Years",PPRep2.Rows.Item(t).Name
objPPRep.Rows.AddLevel objCubeCategories , 0, 0, 1
objcubecategories.Remove
next t
objCubeCategories.Remove
objCubeCategories.Add level_1, "Locations"
objPPRep.Columns.AddLevel objCubeCategories, level_0, _
add_to_all, as_child
Set objCubeCategories = Nothing
Set objPPRep = Nothing
end sub