I'm revisiting this just to document what I have found about making ShowMessage work in a console app. Note my approach is largely trial-and-error with whatever I have have been able to learn from this forum. So the following is what works, not why it works, it's a cookbook solution.
First, I want to use ShowMessage for compatibility with Delphi. Redefining ShowMessage as a Writeln would possibly be confusing later on, at least to me. And then there is the issue that we "should" be able to make it work.
Using LCL/LCLbase increases the size of the console app. For me this is not important. The console apps I am writing are test rigs, for DLLs and some numerical algorithms. A large exe is of no consequence. What matter most is to get things working straightforwardly so I can concentrate on the algorithm development. Others may have different programming priorities.
So to make ShowMessage work I found I needed to do the following.
(1) Add LCL and LCLbase via the project Inspector
(2) Add the units: dialogs, interfaces, forms
(3) Do Application.Initialize at the start of the program
It seems tidy to me to then do Application.Terminate just before the program closes, but I suspect this is redundant.