Controller sensitivity is something that comes up whenever you read into emulating F-Zero X, whether it be on genuine Nintendo hardware and emulators or otherwise. For me there were two parts to this, bad hardware, and controller configuration.
I started off using PDP brand Nintendo Switch compatible controllers. I noticed that there was a large section at the edge of the joystick travel that seemed to have no effect. I found a website that shows raw data input (gamepad-tester) and it confirmed what I thought, the controller was outputting its maximum deflection value before the stick had physically reached its maximum. The solution to this was buying a better controller, see the section further down.
Controller configuration took some more digging. The game still seemed overly sensitive, and there was still some dead zone at the edges of the joystick travel. The crux of this issue lies in the fact that the OEM N64 controller joystick moves through roughly -32 to 32 degrees of travel (reference), while modern controller joysticks move through about -20 to 20 degrees. Fitting the same range of signals into 2/3rds of the travel explains the increased sensitivity. Some searching revealed that Mupen64Plus sends maximum ranges of -80 to 80 to the N64 game, however N64 games rarely use that whole range, and in fact the Nintendo programming guide recommends using ~63 as a maximum. Now, if you moved the original N64 stick to 20 degrees deflection, you would get an output of around 53, so if we scaled the maximum output of our modern controllers to reach 53 we'd have the same sensitivity level of the original controller. Unfortunately most games use more than 53 as their maximum deflection, but in the case of F-Zero X it's only 63. So by scaling the maximum output in Mupen to 63, we get much closer to the standard controller sensitivity and also suffer no loss in the game. This is achieved by setting 'AnalogPeak = 40960,40960' in InputAutoConfig.ini (assuming your controller has a standard max of 32768).
I've found the easiest to use/best looking video plug-in for Mupen is GLideN64, this is also the plug-in used by OpenEmu and RetroArch. The main features I like is that clicking the fullscreen button in MacOS gives you the largest 4:3 resolution, upscaled, I couldn't achieve that easily with the other plug-ins. I did find that playing Mario Kart 64 was a bit laggy though, I could still play mostly fine but I'd miss jump timing sometimes, and rocket starts. Googling this led me to an issue regarding latency on GLideN64 with Frame Buffer Emulation turned on. Sure enough, disabling this improved latency by ~50ms, pretty decent (the linked github issues tells you how to compare). You can change this globally in the Mupen64plus.cfg file, or per game in the GLideN64.custom.ini file. I'll let you consult your favourite LLM about how to do so.
Game mode gives the game processes CPU and GPU priority, and also doubles the bluetooth polling rate which improves bluetooth controller and audio latency. The trick to getting Mupen to be recognised as a game by MacOS is to package the mupen64plus binary in a .app package. The .app then needs to be opened from terminal with the game location as an argument. Going full screen with the green button on the window top left will then give you game mode. I got DeepSeek so package up the .app with the mupen executable I'd installed from Brew.
It seems that most controllers will present themselves in 'dinput' mode, but they don't really show up in MacOS making you think they're not there. Visiting gamepad-tester in Chrome will often show them, and I've also found this tool to be super useful as it detects them, and gives you a button/axis mapping string. Steam will detect them properly in 'xinput' mode but then Mupen can't find them, and sometimes crashes completely. I can confirm that Xbox One, 8bitdo Ultimate 2c Wired, and Sony Dual Sense controllers work fine using dinput.
Note that as of MacOS 27, I need to 'export SDL_JOYSTICK_MFI=0' in terminal before my 8bitdo will be detected in dinput...
Also holding down the b button when you plug the 8bitdo in, puts it in dinput mode, holding x puts it in xinput mode (the mode persists for the next plug in, no need to hold buttons each time).