I am not a GL expert, but AFAIK the OpenGL spec requires the app to flush the rendering pipeline before swapping the buffers.
I would find this extremely strange. For example, the 'glXSwapBuffers' man page says this:
(...) The update typically takes place during the vertical retrace of the monitor, rather than immediately after glXSwapBuffers is called.
glXSwapBuffers performs an implicit glFlush before it returns. Subsequent OpenGL commands may be issued immedi- ately after calling glXSwapBuffers, but are not executed until the buffer exchange is completed. The only mention I have of 'glFinish' being useful is when multiple GLX contexts share the same double buffered window (a bit later in this man page).
So I would definitely think that this is a bug in the fglrx drivers and Wine is not the place to fix it...
Lionel
PS: but thanks to have made me re-read the man page, it gives ideas on how to try to solve the multi-threaded D3D games problem :-)