Hi Will,
what do you mean by undocumented switches? C++ switch-case statements, complier and linker switches, or something else? Do you have sources of these poorly documented applications or just the binaries?
1) In case that you have a binary and that you mean C++ switch-case statements, you could basically disassemble the binary and search for such statements (probably you would write a simple script to automate the process). Usually larger switch-case statements have a so called address-table (see
Why should I split up my switch block with more than three case statements?). Your script could then theoretically search for all such places in the disassembled code. Note however that different compilers produce different assembly for the same code and that various compiler switches influence this process extensively too.
A good and widely used disassembler you might consider is
IDA.
On top of it Hex-Rays also offers a decompiler. It generates C-code from a binary which would definitely make the search of your switch-case statements much easier.
2) In case that you mean complier/linker switches of binary: Very few of them actually end up in the header of the PE file (for example the image type: exe or dll, the subsystem type: native, windows gui, posix, ..) and could be examined through a PE viewer. However, most of these switches simply determine and influence the way the source code is compiled and linked together into the resulting binary.
I hope this helps,
Robert