It certainly is designed for that. However, for that to be useful most of the time, you need to be performing the match on a unique identifier. In most cases, the _id is used. So, replace this very particular document if it exists, otherwise upsert it.
Your scenario is very different. Replace any document where the Name is Philip if it exists, otherwise insert one. This is more difficult because the .NET driver will always serialize the _id field in the replacement document and, since it is a value type, will come out with it's default value if not set. You need to tell the driver not to serialize the _id if it is the default value. Plus, the _id field cannot be changed when doing the replacement, so it is actually pretty important that you don't serialize _id at all when not matching on _id.
My take on upserts is this. In most business cases, you know whether you are inserting or updating. I'd just do that. If you, as you stated above, have the ability to do a conditional statement, I'd wager a guess that you know if this is a new entity or not.
Hope that helps. Sorry it doesn't behave as expected. We are working through this particular scenario to try and make it more tractable.
Craig