Inside the main "teensy" folder, you'll see the files like
usb.c are really just includes which reference 1 of those 7 folders.
Code:
#if defined(USB_SERIAL)
#include "../usb_serial/usb.c"
#elif defined(USB_HID)
#include "../usb_hid/usb.c"
#elif defined(USB_SERIAL_HID)
#include "../usb_serial_hid/usb.c"
#elif defined(USB_DISK) || defined(USB_DISK_SDFLASH)
#include "../usb_disk/usb.c"
#elif defined(USB_MIDI)
#include "../usb_midi/usb.c"
#elif defined(USB_RAWHID)
#include "../usb_rawhid/usb.c"
#elif defined(USB_FLIGHTSIM)
#include "../usb_flightsim/usb.c"
#endif
This structure grew out of the very early Teensy 1.0 code which initially supported just USB serial and USB hid (back then, only keyboard and mouse). This was around 2009, in the very early days of Arduino and about 3-4 years before Arduino mode their first native USB board, Arduino Leonardo. At the time, most USB code looked like Atmel's examples and
LUFA, incredibly complicated using hundreds of files in dozens of folders (later LUFA added "class driver" code with simpler API and usage model).
Also at that time, Arduino wasn't widely used. Most people in the early days of Teensy used a Makefile and command line compile.
In 2009, when only 2 USB types existed and only a 3rd (MIDI) was on the horizon, simply making another copy of the USB code seemed like a good idea. For non-Arduino usage, each had been published as a separate project.
Of course, by the time Teensy 3.0 was in the design phase (mid-2011 to late-2012), making a new copy of the USB code for each usage case had become a limiting factor. With the far more powerful 32 bit hardware, more USB types would come. Teensy 3.0 also brought DMA-based hardware, rather than the simple polled shared buffer hardware of USB on AVR. Larger memory also gave the ability to do things quite differently. So the USB code was redesigned from the ground up.
Even though PJRC continued selling Teensy 2.0 for nearly 10 more years, the old USB code for Teensy 2.0 was never substantialy changed. It really could not have been made similar to Teensy 3.0's USB, since Teensy 2.0 has only tiny 2.5K memory and no DMA capability. That old core library code for Teensy 2.0 also had a *lot* of careful optimization and even assembly code, which still to this day makes Teensy 2.0 usually outperform other AVR-based Arduino boards, and even some of the ARM-based products running at 3 times higher clock speed and 32 bit data path.
Of course, now that PJRC has discontinued Teensy 2.0, that old code is in deep maintainance mode. As we've added features like CrashReport on Teensy 4.x, the older models have received
updates to at least still compile with programs using the new features. But more substanial updates to that old code for discontinued product will never come. New development effort is going into the current products. The code in each new Teensyduino continues to support the features which existed on those old products at the time they were sold, but new features and changes like consolidating all the USB stuff into 1 set of code with an easy config like usb_desc.h will never be applied to the old Teensy 2.0 code.
So if you want to create a custom USB type on Teensy 2.0, you need to study the code in those 7 folders. Several of then share interfaces in common, so with some work you can probably see those patterns, maybe enough to try crafting an 8th folder, or to change 1 of those 7 to suit your needs.
But that is a lot of work and requires a pretty deep dive into the details of crafting USB devices. In Teensy 4.0 you still need some expertise, but it's meant to be much easier with editing 1 file, just usb_desc.h. Even if you don't need the more capable hardware, buying a new board might still be worthwhile because with 12 years newer hardware comes newer software that was built upon the learning experiences from those early products.