After doing some research, I found a solution and it's called Assembly Binding Redirection
Basically, for any .net .exe, you can add XML code in the application config file to redirect a referenced assembly from a version number to another.
Esri implemented this in 10.0 and up versions in their EsriRegasm.exe utility. (located here : %commonprogramfiles(x86)%\ArcGIS\bin\esriRegasm.exe or %commonprogramfiles%\ArcGIS\bin\esriRegasm.exe)
If we take a look at 10.1 esriRegasm's configuration file (esriRegasm.exe.config), you see these lines :
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="ESRI.ArcGIS.Carto" culture="" publicKeyToken="8fc3cc631e44ad86"/>
<bindingRedirect oldVersion="9.3.0.0-10.0.0.0" newVersion="10.1.0.0"/>
</dependentAssembly>
</assemblyBinding>
It means that they are redirecting all references of ESRI.ArcGIS.Carto from 9.3 to 10.0 to the current assembly (10.1.0.0) so you will avoir errors
In my case, the target version is ArcGIS 9.3.1, and there's no EsriRegasm utility.
I found a solution on microsoft connect site. Add, for each referenced assembly, this xml code to .NET's RegAsm.exe.config file
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="ESRI.ArcGIS.Carto" culture="" publicKeyToken="8fc3cc631e44ad86"/>
<bindingRedirect oldVersion="9.3.0.0-10.1.0.0" newVersion="9.3.0.1770"/>
</dependentAssembly>
</assemblyBinding>
As stated in the microsoft connect artcile : You can copy regasm.exe + regasm.exe.config to a separate directory to avoid impacting all regasm invocations on the machine.
The bottom word is yes, it's possible, but the easier solution is probably to build our assemblies on a development machine with 9.3.1 installed.
I hope this helps someone
EDIT:
In order to make it work in ArcMap.exe or ArcCatalog.exe, you have add the same xml code we put on regasm.exe.config in ArcMap or ArcCatalog's config file.