As you note from the KnowBrainer forum, there were a couple of suggestions that partially solve the problem, but not completely because they're not reliably consistent.
This is a particularly sticky issue with the DNS because there are several formats that conflict with one another: (1) Dates, and (2) Numbers.
In all of the cases that you have reviewed on the KnowBrainer forum up to this point there is a trade-off. You either have to disable dates, alter the number setting, use the Alternate written form, or create an advanced script. Of all of these creating an advanced script is the most complex. Unfortunately, it is also the most reliable. Equally unfortunately, it's a command which requires you to pause. So, even with Advanced Scripting there is a trade-off in order to get the consistent reliability.
Here's another approach that might work more satisfactorily for you and is consistently reliable.
First, you don't have to disable the Dates option in the NaturallySpeaking Formatting dialog.
Second, you can keep the number setting at "10".
Third, open the Vocabulary Editor and entered the first nine ordinals (1st through 9th) in the Written form. Enter these as follows with the corresponding Spoken form:
When you train each of these, you simply say "ordinal one", "ordinal two", etc. up through "ordinal nine". In other words, you simply train them as if you were normally dictating the word "ordinal" followed by the number.
Using this approach you can say all of the ordinals up through 9th along with any month of the year without pausing by simply saying " ordinal<#>" as specified relative to the spoken form above. This will effectively, consistently, and reliably let you dictate any month followed by its corresponding ordinal between 1 and 9. For example, using the ordinal set up in this way I can say:
March 1st (spoken form = March ordinal one)
You do the same for any month and the given ordinal up to 9th.
Now, here comes the trick. The above handles the ordinals from 1 through 9. However, it doesn't handle ordinals following the names of the month for ordinals greater than 9, or 9th. So, how do you get 10th through 31st without having to go into the Vocabulary Editor and enter all of those days of the week in the same manner as 1 through 9 (1st through 9th)?
You simply say: "December 31st or "July 15th. If you pause ever so slightly, and you don't have to pause very long, you will get the ordinal displayed after the month. However, if you don't pause, then you will get "December 31" or "July 15". This is because of a conflict in the date formatting that is coupled with the "Allow pauses in formatted commands.". You don't want to turn off the latter because that kills your ability to pause when saying formatted commands where you want to be able to pause. So, if you turn off or disable that option, you're losing out on a capability that is useful. To avoid having to do that, simply insert a slight pause between the month and the ordinal of the day for every ordinal over 9 and it works like a charm. This allows you to keep all of the desired formatting settings; including dates, pauses in formatted commands, and numbers, while still providing you with a simple way of dictating continuously. Remember that you do not have to pause after saying "March ordinal1 through ordinal9 because these are vocabulary entries which don't require a pause. Also, the reason for using the spoken form "ordinal#" is that those words that don't exist in the vocabulary, so there's no conflict. If you were to enter the spoken form as "ordinal one", it would end up being displayed as text because it would be interpreted as dictation and displayed as "ordinal one".
Try this and I think you'll find that it is a much more practical solution, particularly since I don't think anyone uses ordinals with the month of the year often enough to justify making major changes to the formatting set, and this accomplishes the desired end without compromising your formatting or requiring you to go back and correct misrecognitions using the other approaches.
Lastly, it doesn't require writing a complex script with multiple lists.