Hi Bryan,
Inside Visual Studio, you have to be careful about loading files. The VS shell is super-extensible, so for components from different authors to work well together, there are rules for registering files so that two different components don't clobber each other's state.
It sounds like what you're trying to do is edit a .contentproj file that is currently loaded in the IDE. That isn't really allowed, if you want to do things correctly. Project files in particular are generally owned by the project implementation (a loaded .csproj file is owned by the C# project implementation, for example). Since they often contain buffered state (changes that are in-memory but not yet saved), you can't just load up your own copy of the file, make changes, and then save it out. At best, you'll end up with lost data. At worst, you'll crash the IDE (possibly what you're experiencing).
Projects do support automation, though, and that's how you can make changes externally. Using the DTE is the right way to do it -- basically you are invoking methods on the project implementation so that it can update its own in-memory representation of the file.
In an XNA Game Studio 2.0 game project, there's actually two projects. The .csproj file is the code project, while the .contentproj file is a nested content project. You won't find the content items in the code project's EnvDTE.Project children. Instead, you need to find the EnvDTE.Project for the nested content project. To get this, find the code project, then get its container, then search for a project named "Content".
In XGS 3.0, we're adding extenders to the automation model to make finding nested projects and parent projects much easier.
When I get a chance, I'll continue my blog and show a number of interesting things you can do with content at design-time.