Bon, j'ai réussi à corriger 50% du problème : Le problème de détection des sticks est en fait un problème de valeurs renvoyées par ceux-ci :

Event type 3 (EV_ABS) Event code 0 (ABS_X) Value    127 Min        0 Max      255 Flat      15

Comme on le voit, ils sont codés comme des sticks analogiques sur 8 bits avec 127 comme valeur pour la position centrale. Cela ne permettait pas de les détecter dans ES et faisait planter directement RetroArch quand on en bougeait un (erreur d'out of range). En passant par jscal pour remettre le codage des axes dans le bon sens (-32k;+32k centré sur 0) et en sauvegardant les corrections à appliquer :

mount -o remount,rw / jscal -p /dev/input/js0 > /etc/joystick.cal

Ensuite, appliquer ces corrections automatiquement au branchement de la manette :

mount -o remount,rw / echo 'SUBSYSTEM=="input", ATTRS{name}=="GGG GP-Wiz40 Dev2", MODE="0666", ENV{ID_INPUT_JOYSTICK}="1", RUN+="/etc/joystick.cal"' > /etc/udev/rules.d/99-GPWIZ40.rules

Un reboot, et les axes sont détectés comme il faut ! Reste le problème du deuxième joueur à séparer de la manette 1, les quirks n'ayant pas eu l'effet escompté (hormis le fait que maintenant les axes sont détectés alors qu'avant, non).