The CurrentWorkingDirectory is...a tar pit for people looking to emulate VB6's AppDir (or whatever it was called).
It's true that Process sets it to the app's startup dir when starting an application...but its absolutely the last thing to rely on as a quick AppDir property.
Why? Because other things change it -- such as FileDialog:
<<<
Anyhow, to cut a long story short, the FileDialog changes the current working directory to the last selected directory (unless a property is set: RestoreDirectory). This causes the assembly loader to look in the incorrect directory.
>>>
His solution was to instead rely on AppDomain.CurrentDomain.SetupInformation.ApplicationBase which solves some of the problems
Note that it works for PC, ASP.NET, but not CF, as demonstrated here: http://demos.xact-solutions.com/Investigations/ASP.NET/AppDir/Default.aspx
Getting a cross platform solution to entry assembly and startup path is more complicated really...requires precompiler directives, P/Invoke on CF, etc.
Link: