After an unholy amount of uninstalling and reinstalling drivers, firewalls and modules, I finally have WPA wireless connections to an Airport Express from all three of Windows 98, Mac OS X and Linux (Ubuntu Hoary), using a Netgear WG311v2 card.
For future reference and other people having problems, here are some notes while I remember:
Mac OS X: used Airport Admin Utility to set up the Airport Express with a WPA password, broadcasting the SSID. All systems will use DHCP for their IP addresses.
Windows 98: downloaded the WG311v2 driver version 2.0.0.7 from Netgear's site. Uninstalled Sygate Personal Firewall (if you don't do this, the file Teefer.vxd panics when it can't find a network device and very helpfully shuts down your computer during startup). Restarted into Safe Mode and uninstalled all the old Netgear software and drivers (system files to remove are detailed here). Restarted into Windows and when it detected the new hardware used 'Have Disk' to browse to the downloaded driver/Windows98 directory to select the driver. Once Windows had started up, went into the downloaded folder and from the Utility folder ran Setup.exe (rather than the main installer). After restarting, the utility program should start up, so could choose the network and enter the WPA password. Reinstalled Sygate Personal Firewall.
Ubuntu: Installed all the latest updates to Hoary, and had installed ndiswrapper and wpa_supplicant already. As described here, removed all references to acx_pci in the modules directory, then installed the Windows XP driver (an older version, 1.0.1.7, from Netgear's site) using ndiswrapper. Had already added the text described here to /etc/wpa_supplicant.conf and /etc/network/interfaces. After rebooting, the wireless card was detected fine and the network was joined.
Note that some of this might not be necessary, and there may well have been an important detail amongst everything else I'd tried, but this is what I can remember working this time.