Compilers have to be compiled themselves. This happens on the "build" machine. Normally the build and host computers are the same, but they don't have to be. A Canadian cross compiler is one where the build and host archetectures are different. For example, using a Solaris computer to compile a compiler that runs on a GNU/Linux machine but which produces Windows executables would be a Canadian cross compiler.
The cygwin target allows POSIX / Unix source code to be easily ported to Windows. It also allows a single source-tree to compile to both GNU/Linux and Windows targets.
Cygwin provides a number of routines in a DLL file to ease the burden of porting applications to Windows. Because of this, all programs compiled by a cygwin compiler are linked against this DLL, so the DLL is required for those applications to work. (Well, actually its possible to compile code with cygwin that isn't linked against the cygwin DLL)
Mingw is a "minimalist" compiler. It provides access to standard Windows API, but without any attempt at providing a unix-like API. Some of this API is similar to some of the POSIX API, but much of the underlying models (such as threading) is different under Windows, so you cannot easily have the same code compiling to produce GNU/Linux and Windows executables.
If you want to port an existing application or maintain code to run both under Unix-like OS and Windows, then cygwin is a sensible choice. For compiling Windows-only applications, applications that only use Windows DLLs, then mingw is an option.
The set of API provided with MinGW has missing functionality. Some additional defitions are provided here: