Let us look at this the object oriented way. A project just has a version --in the sense that a code change makes it is different from its previous version. Therefore, version must be a property of the project.
On the other hand, a project (in most cases) does not test itself or certify it. That decision is made by the testing/QA teams. And hence, while you/they can label the project "Alpha", "Beta", "RC", "Gold", "Platinum", "Retail" etc. this labelling is not a property of the build but rather of your perception of that build.
It is tempting to store this information in the project itself (perhaps even in the AssemblyInfo.cs) but as your question and Caleb's answer shows it requires re-building the project after each stage (to edit/remove the watermark).
So here is the solution --generate the watermark at run time by using another system (can be as simple as a web object queryable by your project, a simple file, database entry --you decide). The key is to keep this system outside the project scope and only have the testing authorities update the build "watermarks".
Here is how this system looks like (with the timeline):
Version | Status | Comment
------------------------------------------------------------------------------------------------------------
1.0 | Alpha | First dev. build released
1.0 | Beta | Dev. team tests and decides to release it as beta without any code change/rebuild
1.0.1 | Beta | QA team identifies a bug, dev. fixes, rebuilds, updates the version, sends it for more testing.
1.0.2 | Beta | QA team identifies a bug, dev. fixes, rebuilds, updates the version, sends it for more testing.
1.1 | Beta | QA team identifies a bug, dev. fixes, rebuilds, updates the version, sends it for more testing.
1.1 | RC | QA team promotes it to RC build. You send the exact same build for user testing/preview.
1.1 | Retail | Users do not report bugs, QA team also does not. You decide this build (without any change) can be shipped to retail.
An added advantage of this system is that you control the build tag and can easily create a newer tag (e.g., expired, recalled) and push it out without application reinstalls or rollouts. As a fail safe, the watermark should show a default value or last queried value in case it cannot establish a connection to the system.
Edit: If you are not fan of external systems, then just keep a simple file within the project itself but not embedded into the main assembly/jar/etc. This file can track the build watermark. The key is to not embed the watermark into a unit that has to be compiled in order to be changed.