Ok, seems like a simple fix works at least in my case. In Shape3D.java (SVN Feb 16.2007) in method updateBounds(boolean onlyDirty) I replaced:
bsph.compute( geom );
with:
if (getTransformGroup() == null)
bsph.compute( geom );
else
bsph.transform(getTransformGroup().getTransform());
Got immediately LOTS more of FPS

I don't know if this is a generally valid fix... Maybe someone with more insight to the engine knows.
I will definitely implement a fix inspired by your code. But your code can't work for general case. Consider, you're modifying the TransformGroup's Transform3D twice. Then you would first compute the BoundingSphere, then transform it after the TG has changed and then after the other change, it is again transformed.
The "untransformed" BoundingSphere has to be cached and the "real" BoundingSphere has to be built from it.
I don't know that much about the internals of the picking library; however, that change feels dangerous to me for general use. When you created your shapes, did you try making them Shape3D.Types.STATIC? The default is Shape3D.Types.DYNAMIC which has the least optimizations. There are a couple levels in between but your code change clearly implies the STATIC choice.
This won't make a difference.
Thanks for the reply. I did try that but it makes no difference. But you are correct, the STATIC should be my choice (which it wasn't previously).
Oh, I just forgot again to write some lines about Shape3D.Types in XIN. I will do it these days. If I don't, please remind me.
Marvin