Yes, it is the "intended" behavior. I use the scare-quotes because really, I'm punted. As a library designer, I try to make as a few decisions for you, the user, as possible. In this case, I didn't want to much about with embedded objects because I have no way of knowing what their original type was, and it's a bit tedious to deal with lots of nested dictionaries. At best, if you, as the user, know that "nestedObject" is a dictionary, you can at least do is something like props["nestedObject"]["name"], but that still is awkward. Instead of using standard generic dictionaries, I could create a custom class with an indexer that would allow for stuff like props["nestedObject.name"]. While that's better, I think most people are just going to want to work with their own domain models. Plus, it would be a lot of work and it's not a typical C# pattern (apart from some data-binding libraries).
So, I opted to leave things as is, and let the developer handle those decisions for now. I've discussed this with some other people, and we all feel like it's sort of surprising when you come across this, but is ultimately appreciated. We will be adding a convenience API eventually that will handle deserializing the entire object graph for you, but I expect that to be implemented as extension methods so it wouldn't change any existing behaviors. It would just handle .ToObject<T> for you. That way, if you need to do some special processing during deserialization, you can. It may also require the user use
JSON.NET support for JSON-SCHEMA, or something similar. This has to be very well thought out, however, and so we won't be rushing into it. We want it to be as low friction as possible.