I followed the instructions in this article with some additions.
Step 1: add startx to /etc/rc.local
Step 2: allow non-interactive processes to launch an X server
(and select Any User)
Step 3: add your application to ~/.xinitrc
I deviated here a bit, to run my mono app I wrapped it in a perl script, which monitors STDOUT and STDERR because I found that there can occasionally be exceptions which cause the program to stop being displayed, but the mono process does not exit. I monitor the output for /exception: read failure/i and if it is in the output, I kill the process and start another. I'll post the script if anyone wants it.
These steps are enough to start x and run my app, but its actually pretty much the same as running the standard LXDE with an autostart entry.
Step 4: Change the x-session-manager
Step 5: Add a startup background
I discovered that x starts pretty quickly, but it leaves the background black for quite a while before it begins to draw my application. So I want to display a png file in the background while my app is starting.
feh can be used to display an image, so I just added it to my xinitrc file
Now almost as soon as the screen goes black, it displays my waiting image.
Step 6: remove the normal raspi-config start x
This solution works perfectly for me, I don't mind some text scrolling on startup, but I know there are ways to get rid of that too. Now there is no overhead of menus etc, and the only app running in the GUI is mine. Job done.