My guess (and it is no more than that) is to change the line to Rotary r = Rotary(2, 8 ); - but maybe you have already tried that.
You should not have the line Serial.println(result == DIR_CW ? "Right" : "Left"); in your ISR.
Just have the ISR save a value to a variable and set a flag to say the variable has been written. Then in loop() you can print the value if the flag is set.
When I have used pin change interrupts on the UNO digital pins 8 and 9 my code looked like this
PCICR |= (1<<PCIE0);//enable group interrupts on PORTB PCINT[7:0] Digital pins 8-13
PCMSK0 |= (1<<PCINT0);//enable interrupt pin 8
PCMSK0 |= (1<<PCINT1);//enable interrupt pin 9
The ISR for those pins is indeed ISR (PCINT0_vect) which handle pin change interrupts for D8 to D13.
With the code you posted PCINT4 and PCINT5 should be for pins 12 and 13.
I don't know how rotary.h works, and whether or not it can deal with pins on different ports. The pin pairs 2,3 (PortD) and 8,9(PortB) and A0,A1(PortC) are frequently used because they are on the same Port and that fact makes it simple to check what has happened when an interrupt is triggered.
You say you cant use pin9. What about 8 and another pin on PortB. The set up for PCMSK0 will have the bit shift into PCINT2 Pin10; PCINT3 Pin11; PCINT4 Pin12 and PCINT5 Pin 13.