Puedes agregar la información a los recursos del ejecutable como array de bytes, si la serializas, haciendo uso de las API:
Puedes prepar el ejecutable a generar para buscar en el mismo el recurso, que no existe en el momento que generas el ejecutable, sino que se le agrega después de que se genera. Puedes buscar información de como se usan estas API, espero que te sirva de algo, si no logras dar con la funcionalidad avisas y te doy un ejemplo
Código (vb.net) [Seleccionar]
<DllImport("kernel32.dll", SetLastError:=True)> _
Public Function BeginUpdateResource(ByVal pFileName As String, _
<MarshalAs(UnmanagedType.Bool)> ByVal bDeleteExistingResources As Boolean) As IntPtr
End Function
<DllImport("kernel32.dll", SetLastError:=True)> _
Public Function UpdateResource(ByVal hUpdate As IntPtr, _
ByVal lpType As Integer, _
ByVal lpName As Integer, _
ByVal wLanguage As Integer, _
ByVal lpData As Object, _
ByVal cbData As Integer) As Boolean
End Function
<DllImport("kernel32.dll", setlasterror:=True)> _
Public Function EndUpdateResource(ByVal hUpdate As IntPtr, _
ByVal fDiscard As Boolean) As Boolean
End Function
<DllImport("kernel32.dll", SetLastError:=True)> _
Public Function LoadResource(ByVal hModule As IntPtr, _
ByVal hResInfo As IntPtr) As IntPtr
End Function
<DllImport("kernel32.dll", SetLastError:=True)> _
Public Function LoadLibrary(ByVal lpFileName As String) As IntPtr
End Function
<DllImport("kernel32.dll")> _
Public Function FindResource(ByVal hModule As IntPtr, _
ByVal lpName As Integer, _
ByVal lpType As Integer) As IntPtr
End Function
<DllImport("kernel32.dll")> _
Public Function LockResource(ByVal hResData As IntPtr) As IntPtr
End Function
<DllImport("kernel32.dll", SetLastError:=True, EntryPoint:="FreeLibrary")> _
Public Function FreeLibrary(ByVal hModule As IntPtr) As Boolean
End Function
<DllImport("kernel32.dll", SetLastError:=True)> _
Public Function SizeofResource(ByVal hModule As IntPtr, _
ByVal hResInfo As IntPtr) As UInteger
End Function
<DllImport("kernel32.dll", CharSet:=CharSet.Unicode, EntryPoint:="EnumResourceNamesW", SetLastError:=True)> _
Public Function EnumResourceNames(ByVal hModule As IntPtr, _
ByVal lpszType As Integer, _
ByVal lpEnumFunc As EnumResNameProcDelegate, _
ByVal lParam As IntPtr) As Boolean
End Function
Public Delegate Function EnumResNameProcDelegate(ByVal hModule As IntPtr, _
ByVal lpszType As IntPtr, _
ByVal lpszName As IntPtr, _
ByVal lParam As IntPtr) As Boolean
Puedes prepar el ejecutable a generar para buscar en el mismo el recurso, que no existe en el momento que generas el ejecutable, sino que se le agrega después de que se genera. Puedes buscar información de como se usan estas API, espero que te sirva de algo, si no logras dar con la funcionalidad avisas y te doy un ejemplo