I did some research today and I mostly know how level saving works (I used JKSV to extract exdata/save):
-All level related things are in exdata.
-Exdata is made of 221 files, 220 of them are actual levels and 221st one is like an index/table of contents thing, idk how it is in English (and I'll be calling it index from here).
-All exdata files have 8 byte long signature thing at offset 0x10, both levels and index
-The same signature also exists at the beginning of the save, and it's most likely compared to the one from index. However the game apparently also has some other way of checking if exdata is connected to the save, because it threw an error about invalid exdata even if the values were the same (or maybe I did something dumb)
-Editing first 3 bytes of the save file makes the game throw "save data is corrupted and will be reset" so don't do that
-index is responsible for storing where you put the level in the level list. Basically there are 220 bytes at offset 0x2C that tell the game from what file it should read the level data, for example if 0x2C is 0x00, first level in the first world will be read from file 000, 0xFF means the level slot is empty. That said, it can't be easily edited and it actually reverted any changes I had done to it! It most likely has something to do with 4 bytes at 0x24, as they seem to change.
Injecting levels is easy tho (at least on the same console?). Just replace file of an existing level with a new one, and change signature thing at 0x10 so it matches the one from index file (I mean, I didn't check what happens if you don't do that but it probably won't work).