Всем спасибо за ответы! Особенно Alex03. 
Действительно, флаг Qt::WA_TransparentForMouseEvents делает окно прозрачным для кликов мышки. Но MouseMove не проходит, да и курсор отображается не нижнего окошка. Покопавшись в исходных кодах Qt, стало понятно, что  Qt::WA_TransparentForMouseEvents делает окно незаметным для функции QApplication ::widgetAt(). Это делает задачу поиска нижележащего окошка довольно простой. 
Если точно знать название класса тени, то можно перекрыть функцию QApplication::notify(), и в ней перераспределить сообщения. Теперь наше окошко действительно "прозрачное".
bool CMyApp::notify ( QObject * receiver, QEvent * event ) 
{
	if (receiver->inherits("CShadowWidget")) // сообщение пришло тени
	{
		if (event->type() == QEvent::MouseMove)  // и по ней двигается мышка
		{
			QPoint p = ((QMouseEvent*)event)->globalPos();
			QWidget* newReceiver = widgetAt(p); // найдём того, кто лежит под тенью
			if (newReceiver) // а таки лежит
			{
				((QWidget*)receiver)->setCursor(newReceiver->cursor()); // поставим на тени курсор от ниже лежащего
				receiver = newReceiver; // переправим событие нижележащему
			}
		}
	}
	return QApplication::notify(receiver,event);
}