Windows CE build is quite a complex process.
It involves different tools to parse makefiles, build and link code, merge resouces, make the OS image etc. and if something fails during the build is not always easy to understand what's wrong.
The first place where you can check is the build ouput window.
Most of the errors can be solved from there: compilation errors, link errors, files missing during makeimg etc.
If the output window does not provide the information you need, you should check two files: build.err and build.log under the windows CE root directory (usually C:\WINCE600).
Build.err usually has a single error message. Most of the times it simply tells you to check build.log.
build.log contains a detailed log of the whole build process and can be useful to understand where the process stopped and a mean to check all files, command line parameters etc. passed to the tool that failed its build step.
If even build.log can't help you, you can enable extra outputs to try to understand your problem.
If you open a build window (you can use the "build\Open release directory in build window" option of Visual Studio main menu) you can enable the full output of the build process by setting the _ECHOON environment variable to 1:
Then you can start a Windows CE build from the command line:
blddemo clean -q > buildoutput.txt
This performs a clean sysgen of your OSDesign (it seems that someone did not change the name of this bat since the times when CE was simply a demo OS).
At the end of the build, In buildoutput.txt you'll have the most detailed report of the build process you can get, including each step performed by the build bat files, build tools, compiler etc.
Setting _ECHOON to a non-null value simply disables the call to ECHO OFF performed at the beginning of the build batch file, echoing all the commands performed during the build on the console.
If even that doesn't lead to an explanation for your problem, at least gaves you something useful to attach to a question posted to the Windows CE support newsgroups.
In my experience the two most common reasons for "strange" errors during build (with "strange" I mean errors not related to your own code or configuration files) are file or directory names with spaces or wrong installation of QFEs.
When you install QFEs you should install them in chronological order and remember to install the latest yearly QFE and all the QFEs of the monts up to the last QFE you decided to install. If you don't install some QFEs you may have new files (in more recent QFEs) that use some functions declared or implemented in another QFE and this could lead to compilation errors or linking failures inside the OS code branches.