As a general rule, it is much easier and more reliable to compile on the actual distribution on which it will be executed. There are often 'families' of distributions where you can get away with compiling on just one distribution in the family. Sometimes, families have tricks that enable you to minimize the number of compilations necessary.
You can generally make a single build for all modern versions of Windows. If you want to make a native 64-bit application, you'll need a second build. Generally, you can make this build on any version of Windows, but it's usually easiest to make it on the most current version you plan to support. (Windows is the exception. On other platforms, it is easiest to use the oldest version you plan to support.)
You can make a single build for all Linux platforms with at least Pentium 3 CPUs and kernels of version 2.6.0 or later. There are a few tricks to it, but it can be done.
You can make one build for all Intel Macs. Again, there are a few tricks to it, but it can be done.
Cross-compiling across OS families tends to be more trouble than it's worth. You need the native platform to test on anyway. For large deployments, one extra machine to build on is no problem. For small ones, use the test machine to build on -- you need it anyway.
The main exception is 'small' platforms that are intended for cross-compilation anyway. Small embedded systems, for example, may not even be capable of compiling on the native platform.