I can explain from a data POV but not sure about which tools to use.
Emerald -
Trainer Data: 0x310030
Trainer Sprites: 0x305654
Trainer Palettes: 0x30593C
Trainer Data -
Each trainer is represented consecutively by 40-byte groupings. There is a lot to the data, just know the trainer sprite ID is the 4th byte.
To get a specific trainer data offset, you can do (0x310030 + (40 * trainer ID)).
Sprites -
The table for trainer sprites is located at 0x305654 and each trainer sprite is represented by 8 bytes. The first 4 are the pointer to the sprite in little endian format (ignore the leading 08). I think the other 4 are for elevation in battle.
To get a specific trainer sprite offset, you can do (0x305654 + (8 * sprite ID)), then grab and reverse the next 3 bytes (the offset in little endian format).
Palettes -
Very similar 8-byte structure to the sprites. The first 4 bytes are the pointer to the palette in little endian format. No clue what the other 4 are.
To get a specific trainer palette offset, you can do (0x30593C + (8 * sprite ID)), then grab and reverse the next 3 bytes (the offset in little endian format).
Expansion -
To create new trainers, you are best off replacing existing ones. If you truly want to expand the table, you will likely need to repoint your table altogether to prevent the expanded table's data from running into import bytes, which could break your entire ROM. A quick HEX search for the table offset as a pointer (e.g. 54463008) shows a few possible locations where the table is currently being referenced and will need to be changed to the new table offset:
0x1CC408
0x18D07C
0xB5F3C
0xB5EF8
0xB5DF78
Good luck