How compatible is the Xiao to an Arduino e.g. Nano?

OK then I’m thinking either the interrupt isn’t being recognized or the data interpretation is going astray.

Make a backup copy of DCC_decoder.cpp & .h

Somewhere in your program you define the interrupt pin: #define kDCC_INTERRUPT 2 // make sure it says 2 for your interrupt pin

To see if the interrupt is being recognized by putting an indicator :
find the ISR DCC_Decoder::DCC_Interrupt() about line 50 in DCC_decoder.cpp
insert the line Serial.print(func); // this will print ISR name DCC_Interrupt on the serial monitor when the interrupt happens UNLESS Serial.print() is inhibited by the interrupt.
Run the program, send the data stream to pin 2 and see if the message is printed, if not then use indicator plan B

Plan B
Set an output pin to a known state (ie High) in Setup() Set it to the opposite state (ie low) in DCC_Interrupt(). Assure each state happens when it should.
If not seeing opposite state at interrupt then the interrupt isn’t getting thru.