[JsonProperty]
always binds a single property in the JSON to a single member in a class. You cannot use it to bind multiple JSON properties to a single dictionary. It doesn't work that way.
However, Json.Net does have a [JsonExtensionData]
attribute that works the way you want. Try this instead:
[JsonObject]
internal abstract class DynamicMessage : DynamicObject
{
[JsonExtensionData]
public Dictionary<string, object> dynamicProperties =
new Dictionary<string, object>();
...
}