First, use the FD9F (H.TIMI) hook, it's the one called every 50th or 60th second.
The FD9A (H.KEYI) hook is for ALL interrupts (MIDI, moonsound, RS232, etc).
Second, you have to store the previous hook value, call it during your program, and restore it when your program exits.
Then, there is no reason to switch to IM1, as it's the normal Z80 interrupt mode for MSX.
Pushing/popping all registers is not necessary, as the RST38 ISR does that itself. However, you SHOULD PUSH/POP AF to the stack, because the ISR stores the VDP statusflag there.
Also, don't put EI/RET at the end of your interrupt handler, because RST38 will enable them itself, and should remain off during all interrupt handling.
The rest of your code looks fine
It's going to look like this:
MyIntHandling: PUSH AF ; push AF, no need for DI, that's already assumed.
CALL MyVDPEngine
CALL MyPSGEngine
POP AF ; pop AF again, we fall through into the OldInt
OldInt: DB 0,0,0,0,0 ; 5 bytes for the previous hook code
Main: DI
LD HL,0FD9Fh ; save current hook to OldInt
LD DE,OldInt
LD BC,5
LDIR
LD A,0C3H
LD (0FD9FH),A
LD HL,MyIntHandling
LD (0FDA0H),HL
.
. ; don't forget to EI somewhere in this code to enable interrupts again

.
RET
then put this code in your exit-code:
DI
LD HL,OldInt ; restore hook
LD DE,0FD9Fh
LD BC,5
LDIR
Alternatively, in stead of falling through to the OldInt, you can also put CALL OldInt somewhere in MyIntHandling and just return with a RET, if that looks cleaner to you