Any boot code must embed an Image Vector Table that helps the ROM code to localized the different bricks required at boot.
If this misses from the boot code or if the boot device is blank, the ROM code jumps to the serial download mode. So, that was probably not needed to tweak the QSB with a jumper.
You can find more details in the "System Boot" section of the reference manual.
1. Your bootmonitor.elf must contain that IVT and boot data section.
2. Moving from an elf to a binary is simple by using your ARM compiler objcopy command like:
arm-none-eabi-objcopy -O binary bootmonitor.elf bootmonitor.bin
3. When loading code to internal RAM at boot, the code can't be loaded anywhere. It has to be in the iRAM Free space which starts at 0xF8006000 (figure 2-2 in the manual). Otherwise, it overrides area reserved for the ROM code execution.
By using the mfgtool, you should be able to download and execute that code. A simple way to do that is to use a profile like this one in the ucl.xml:
<LIST name="DWLD_IN_SDP" desc="Download and execute a binary!">
<CMD type="find" body="Recovery" timeout="180"/>
<CMD type="boot" body="Recovery" file ="bootmonitor.bin" > Loading bootmonitor </CMD>
<CMD type="jump" > Jumping to bootmonitor. </CMD>
</LIST>
The destination where the code must be loaded is specified in the IVT, so that the mfgtool uses it to extract the address automatically.
You can use other methods, such the python script that I posted some time ago.