Returned... now to find a 20x4 LCD that actually works good.
I re-arranged the PCB so I can use Wire0 to make code use simpler, and then ran the clock and data lines through a voltage translator to boost them to 5v.
To be sure, for I2C you need a bi-directional voltage translator to handle I2C. I.e. you have to boost the signals from the Teensy from 3.3v to 5v, and you need to lower the signal from the I2C devices to the Teensy from 5.0 volts to 3.3 volts.
And in some cases, you might also need to incorporate pull-up resistors (typically 2.2k) between each of the SCL/SDA pins and 3.3v. I recall that one of the Adafruit level shifters said it wasn't really recommended for I2C traffic, but using pull-up resistors could help.
Many newer devices also incorporate pull-up resistors in their logic. For the older devices, you often had to have one set of pull-up resistors on the I2C to help the device with I2C. So, I often put pull-up resistors as a matter of habit on my Teensy I2C lines. Adding the pull-up resistors will also allow you to scan the I2C bus to see if there are devices (for example, you might want to add a display during development, but not use it in the final gadget, and you wanted the code to detect if the display was present). If there is nothing on the I2C bus, doing the I2C scan can fail without the resistors.
I recall when I was still using Arduino UNOs and switching to Teensy, that many of the 16x2 and 20x4 displays at the time required 5 volts. I may still have one or two in my parts drawer of holding. But I believe that the newer displays can happily run on 3.3v and don't need to boost/lower the voltage. I haven't bother to do level shifting for a couple of years now.
In the past, when I still had 5v only I2C devices, the level shifter of choice that I used was:
I find the 128x32, 128x64, and 128x128 OLED displays (both I2C and SPI) to be easier to read when they are just displaying text than the old 16x2 and 20x4 text only LCD displays. In general, the OLED displays tend to be cheaper. Finally, if you are trying to read the displays outside, the LCD character displays might not be viewable if you wear polarized sunglasses. That being said, the OLED displays do require you to buffer the whole screen in memory. Many times with Teensys that is not a problem (when I used ATtinys and Arduino UNOs, it was more of an issue).