I've done some research into the problem and also contacted the AWT developers. Here is the situation: the low-level AWT code is completely broken and needs big rework. It is unlikely that it gets fixed before JDK7 (and there are no guarantees, because this is formally a low-priority bug: non-reparenting WMs are not officially supported), although AWT developers are trying to improve the situation in background.
Recently (in JDK 1.6u1) they added support for Compiz and LG3D WMs which don't do reparenting. Thus it is possible to make Xmonad pretend that it is one of these WMs, and thus workaround the problem. However pretending to be Compiz doesn't help (because of another AWT bug, cf. the insets problem). For LG3D there is a special branch which resets the insets to zero, which happens to be just what we need. Setting WM name to "LG3D" fixes gray-rectangle-instead-of-a-window problem.
The patch adds a new XMonadContrib module. One should make a key-binding which executes the (setWMName "LG3D"), which should be used before running Java GUI programs. It is okay to execute this action several times, it takes care not to leak windows.
Ivan