.Net gets its data from Windows (at least it has since .Net 4.0 -- and even in prior versions the only difference is in the final default data). The short date pattern is returned by a call to GetLocaleInfoEx with the LCTYPE of LOCALE_SSHORTDATE.
The process for returning the appropriate data is effectively (there are optimizations in place) to check to see if the locale name requested (in your case "es-DO") is the current user locale and if so to check and see if there is a user requested override for that value. If there is then it is returned, if not, then if there is a custom culture installed that replaces the default data, that data is returned. Finally, the default supplied data is returned.
The default data is part of an internal database that is maintained by Microsoft. That database has been maintained for ages and periodically reviewed by in country language experts. If you see something that doesn't seem right and you are a native speaker, you should report it as a bug. Sometimes there are legitimately more than one way to express the data and the speakers themselves are split as to which is the "right" one. That is why users can override the defaults for the user locale.
There are a couple of options for working around this:
- Change your user default for the short date (language and region control panel) when es-DO is the user locale
- Create a custom culture that replaces es-DO
- In your code, select a pattern that contains a 4 digit year. (The pattern you expect is in the data, but it isn't the default)
If you choose to do the last, you will want to look at the DateTimeFormatInfo.GetAllDateTimePatterns method. Use the 'd' format to get all the short date formats and then you can find the first one containing "yyyy".