Even for AMOD you still can do something like this "DSU->ADDR.reg = addr | DSU_ADDR_AMOD_xxx;".
XOR with 0xffffffff is a separate from the reversal. CRC algorithms generally have independent parameters bit reversal and the need to invert the result are completely independent.
Often you inverse to get the final value, and if you are updating the value, intermediate results are not inversed.
Yes, you need to pad the data. The write is triggered when PAGE_SIZE bytes are received, so you were not writing the last page with incomplete data. It is easy enough to fix, but I personally believe that the host must provide the padding. You don't want the bootloader to "guess" the stuff for you.
I never use inversed bersion, since I see no point in doing additional work.