When I was at U.C. Davis everything was pretty much Unix programming.
As for cross platform if you do it in C/C++ it just has to be done properly. A properly written program will have no issues with Byte ordering, and will be much easier to migrate between OSX and Win API calls.
Java is all right, but its not the end all answer everyone makes it out to be. Too many people think it can do anything you want, be easy to implement, and do it as well as other languages. Its got some severe performance issues in certain areas, for one thing. And to be truely cross platform, you're limited to what you can make use of.
The key to making applications for multiple platforms, or even making applications for just one, is planning. People do not plan enough out before they start development. I've seen too many projects start development with only minimal planning, if any at all.
If you properly deisgn the application architecture, then use proper programming methods, you can make an application that can be easily ported between platform with only library/table changes and minor function call changes.
For the wine/crossover thing, much speculation is still going on as to whether companies will port apps to both, or just take the easy road out and tell you to boot into windows (nevermind the cost of windows). Someone will most probably port wine or something over.
I'll have to check out the Mono thing, myself. I'm trying to get back into programming, having last developed in VB6, and recently looking at xcode.