This is very general advice, so it might not pertain. A Dataset is often the result of some other processing, and that other processing should ensure that the Dataset is valid. So, I would actually suggest you look at putting your validation logic somewhere else.
Second, your example is a sort of "degenerate" Dataset. The typical Dataset has a list of associations. It would be much harder to validate that list-of-associations form with this kind of pattern matching, and it's a diminishing returns situation.
Furthermore, whatever queries you do on your Dataset will generate validation messages that will help you track down problems.
If you do really want to validate the Dataset itself (rather than put more effort into constructing a valid Dataset in the first place), then rather than pattern matching you might want to build your own MyDatasetValidQ function. It can map over all of the associations and check key names and value structure. It might leverage KeyExistsQ. Maybe it will use pattern matching at the value level, but that'll be easier than trying to do an all-in-one validation on the entire Dataset.