The Windows API provides for setting a service specific exit code. The SetServiceStatus function can be called with a SERVICE_STATUS parameter with these settings-
dwWin32ExitCode
The error code the service uses to report an error that occurs when it is starting or stopping. To return an error code specific to the service, the service must set this value to ERROR_SERVICE_SPECIFIC_ERROR to indicate that the dwServiceSpecificExitCode member contains the error code. The service should set this value to NO_ERROR when it is running and on normal termination.
dwServiceSpecificExitCode
A service-specific error code that the service returns when an error occurs while the service is starting or stopping. This value is ignored unless the dwWin32ExitCode member is set to ERROR_SERVICE_SPECIFIC_ERROR.
Unfortunately, it appears that the .Net ServiceBase class does not expose this capability. The relevant data members of the ServiceBase class are private and cannot be seen by a user's derived class. And even if P/Invoke was used to call the Windows API function the data members of the ServiceBase class would be unaffected.
In any event, you could try using P/Invoke in a test to see if it might suit your purposes.
The MessageBox displayed by the Service Control Manager for a service specific exit code looks like this -