Good general summary.
Here are some additional considerations and reasons for walking the device tree:
1. Calling GetMaxDevice() and then assuming you can or should run on that screen may not necessarily be the right programmatic assumption. Walking the device tree allows you to see what's present and then offer the user the best choice, not just the default one from a high-level call. For example, a user may really want the main device (or your app may want to run on main because of human factors), instead of running on an accessory screen. And, as you say, you can call SetDepth(), as needed. (Clever apps can also call SetEntries() and SetGamma() to manipulate the video output in certain ways.)
2. Besides SetEntries() an app may also need to call SetMode() to toggle color/grayscale.
3. In a multi-monitor system, there may be more than one device that supports the desired depth, but those devices may not be equally capable in other ways, despite having the same pixel depth. For example, graphics acceleration and GWorld support may be relevant/required factors. Or, maybe you want a deep (or any) device that happens to be motherboard/built-in video (maybe for optimal transfer rate). But, you can't assume that any particular device (including motherboard video) is the main/menubar device. The best way to handle this scenario is to walk the tree and offer users choices or include other code that lets your app do the right thing at startup.
4. IIRC, the other problem that can arise is that there can be accessory devices present in the device list that are not yet initialized (not default slot PRAM mode) -- you will see these as grayed-out screens in Monitors. (Monitors can fix these devices just by changing the depth (but it requires more than just a SetDepth() call).
5. Your app may want to run preferentially on certain vendor devices. If that's the case, then you will need to make some Slot Manager calls to read the board sResources -- board or vendor info, etc. You will need the dCtlSlot from the AuxDCE. So, you pass the gdRefNum (same as dCtlRefNum) from the gDevice to a call to GetDCtlEntry(). Assuming it's a slot device, you then get back an AuxDCEHandle (type-cast from the default result of a DCtlHandle) which has the info you would need -- dCtlSlot, dCtlDevBase, etc. -- and then you can make the Slot Manager calls. It takes several steps, but it's not too difficult and will expand your skills!
If your app is simple and you don't really care where it runs, then just use the high level calls and/or add in SetDepth(). If you want to have a better idea of the environment, code defensively and have more control over how and where your app runs, walk the device tree, evaluate what is present, and configure as needed. It's easy - just make some simple utility routines and do whatever is situationally optimal or appropriate.
Apple could have made some of this device interrogation easier via Gestalt and/or other OS/device functionality, and while Gestalt is very useful, it is (or was) also lacking in certain ways for functionality that might have been expected/obviously needed. So, it is incumbent on programmers to make up the difference.
n.b. If you are an MPW user and looking for the definition for low-memory globals, you can find them in SysEqu.h. Other headers of interest are: Slots.h, QDOffscreen.h, Devices.h, and QuickDraw.h. And, as you're learning, it's a good idea to try to become comfortable with parameter blocks and slot/device/driver calls as soon as you're ready for something a little more challenging.