Hi, good question. For this case (different site types), you can also use swap gates to time evolve with further-neighbor interactions. The swap gate would be defined in a straightforward / standard way, similar to a "crossed" pair of identity operators (diagrammatically it looks like two lines crossing over each other).
The main limitation of our existing system, however, is that the part of the code in the BondGate class that makes swap gates for you currently assumes both sites have the same dimension.
So until we extend our system to handle this case, I'd recommend one of these courses of action (I think #2 actually would be best!):
1) extend the code in itensor/mps/bondgate.h in the makeSwapGate function for your needs, i.e. to make a swap gate which is defined appropriately for two different dimension sites
2) rather than using swap gates at all, use a different trick, which eventually I want to make the standard approach in ITensor. This other trick is, whenever reaching a step which involves a swap "gate", to not actually use a gate at all, but just merge (contract) the two neighboring MPS tensors whose site indices are to be swapped, then SVD the merged tensor back apart so that afterward the site indices are in the reverse order. This skips the extra cost of applying a gate to the MPS and automatically works for any dimension of sites. To implement this idea #2, you'd have to modify or make your own version of the code in itensor/mps/tevol.h for the gateTEvol function, which is actually a rather simple algorithm.
Best regards,
Miles