Jon, yes it is possible to do this (i.e. develop a universal binary plug-in using Xcode that loads and runs under Illustrator CS2 and CS3). There are two reasons why the universal binaries for samples from the CS3 SDK don't load and run under CS2.
1) CS2 can't find their plug-in entry point function.
2) The CS3 SDK samples are dependent on versions of suites that are only available in CS3.
Regarding 1 - CS2 will use the entry point function name provided in the 'mach' property in your plug-in's PiPL resource. If the function name provided there is empty CS2 will look for a function named "main" and call that if it is available, otherwise you'll get an "Error loading plug-ins." alert. The behaviour of CS3 is slightly different, if the entry point name is empty it looks first for a function named "PluginMain", then for a function named "main", then gives up with the error alert. The CS3 samples all use an entry point function named "PluginMain" and leave the entry point name empty in their 'mach' property (and their 'mi32' property for that matter). It's straightforward to change this. For example, to name the entry point for the Tutorial sample on the CS3 SDK add the commented line below to Tutorial.r:
#define PIPL_PLUGIN_NAME "Tutorial"
#define PIPL_ENTRY "PluginMain" // add this line
#include "Plugin.r"
Regarding 2 - to have a plug-in that will successfully run under CS2 or CS3 the plug-in must only depend on suites that are available under the host application. The simplest arrangement is to have one plug-in binary that uses the suite versions supported by CS2 - the "lowest common denominator" approach. Alternatively your plug-in can make a run time check of the version of Illustrator it is running under and acquire / use the suite versions appropriately. The CS3 SDK samples don't do either of these things. So if you only make the fix for 1 described above in the Tutorial sample it will still fail to load under CS2 because it will try and acquire suites that are only available in CS3. If you change the Tutorial sample to use the legacy suite versions supported by CS2 (such as AIArtSuite, AIPathSuite,AIDocumentViewSuite, AIUnicodeStringSuite and AIToolSuite whose headers you'll find in the AI120xxx header files in the legacy folder on the CS3 SDK) you can implement a lowest common denominator approach for the sample and it should at least startup cleanly under CS2. There may be further changes required to get all the features of the sample to run properly.
I haven't had much luck getting the Xcode 2.4.1 debugger to host a debug session under Illustrator CS2 - so debugging is painful. But it may well be my own lack of Xcode / gdb knowledge that's the barrier here.