A while back I hacked together this Python script to copy the shape nodes from one joint to a mirrored joint properly. It can do joints with multiple shape nodes but not joints with instanced shape nodes. It only works for joints mirrored across the X axis, but if you fiddle with the scale and rotate commands you might be able to get it to work across other axes as well:
import maya.cmds as cmds
#Select the joint that has the shape node, then select the joint you want to mirror the shape onto and run this script.
sel = cmds.ls(sl=True)
cmds.select(cl=True)
#Move shape nodes of first-selected object to temporary container DAG
shapes1 = cmds.listRelatives(sel[0], s=True)
tempContainer = cmds.group(n="tempGroup", em=True)
for s1 in shapes1:
cmds.parent(s1, tempContainer, r=True, s=True)
#Duplicate the temp container and flip it to match how Maya mirrors joints
mirrorContainer = cmds.duplicate(tempContainer, n="tempGroupMirrored", rc=True)
cmds.rotate(180, 0, 0, mirrorContainer) #Change the values of these commands
cmds.scale(-1, 1, 1, mirrorContainer) #if the joints are mirrored across a different axis
cmds.makeIdentity(mirrorContainer, apply=True, t=True, r=True, s=True, n=False, pn=False)
#This may be redundant but it should ensure the lists have the proper names for the shape nodes
shapes2 = cmds.listRelatives(mirrorContainer, s=True)
shapes1 = cmds.listRelatives(tempContainer, s=True)
#Parent the original joint's shapes back
for s1 in shapes1:
cmds.parent(s1, sel[0], r=True, s=True)
#Parent the properly mirrored shapes to the other joint
for s2 in shapes2:
s2 = cmds.rename(s2, sel[1] + "Shape")
cmds.parent(s2, sel[1], r=True, s=True)
#Delete the leftover groups
cmds.delete(mirrorContainer)
cmds.delete(tempContainer)