There are many factors that come into play when you want to do this type of operation.
Are you moving shapes from a lower level to the top level, or to some intermediate level of hierarchy?
Is the shape you are moving placed in an instanced that has multiple placements? If so, this is a more complicated algorithm because you need to make multiple copies of the shape and know all of the locations where it should be placed.
Do you use mosaics in your layout? This complicates the process since getting the transformation information is more complicated.
Here is some basic code to allow you to move a shape up the hierarchy. It doesn't handle mosaics and only moves the objects for one placement of an instance. In the code below, I used dbCopyFig to copy the data instead of dbMoveFig. This will let you see what is going on without being destructive to the source cellview. If you change it to do a move, you'll need to save the source cellview. I already have the code making the source cellview editable.
To use this, load the code in your CIW. Edit in place down the hierarchy to your lower level cell. Select the shapes you want to move. Press the ctrl-b bindkey. Choose the level you want to return to. You should have a copy of those shapes at the new level.
procedure(myGetItemsToMove(@optional (win hiGetCurrentWindow()))
let((transList items sourceCv)
transList = reverse(mapcar('lambda((x) car(x)~>transform) geGetHierMemInst(win)))
items = geGetSelSet()
sourceCv = geGetEditCellView()
list(nil 'transList transList 'items items 'sourceCv sourceCv 'win win)
let((newLevel destCv transList transform)
newLevel = deGetEditLevel(data->win)
destCv = geGetEditCellView()
transform = myConcatTransforms(transList)
;use dbMoveFig to move the items
dbCopyFig(item destCv transform)
newTrans=list('(0.0 0.0) "R0" 1.0)
;transList is in order from bottom of hierarchy to top
hiSetBindKey("Layout" "Ctrl<Key>b" "let((data) data=myGetItemsToMove() geReturnToLevel() myMoveItemsHierarchically(data))")