Is it possible? Well let's look at the situation here.
A zip is an archive format. It does not specify a magic number; instead a zip file is identified by the presence of marked records (zip entries) present anywhere in the file.
In windows, an EXE is a file format defined by a magic number. It allows for the inclusion of arbitrary data and specially-marked places in the file.
Combining the two, it is possible for file to be both an exe and a zip. This possibility is exploited in producing self-extracting zip files (SFX): an exe which reads itself as a zip file and extracts the entries contained within. An SFX is basically comprised of some "stub" exe logic that knows how to read and extract any zip file, plus a variable set of zip entry records.
Your requirement - an archive format that extracts itself, then runs a particular file from the extracted content - requires an SFX stub that is only slightly more capable than the standard one. It must extract files, then run one of those files.
DotNetZip is a .NET-based zip library that allows your .NET app to produce zip files, including SFX files. The SFX stub provided by DotNetZip includes the ability to invoke one of the extracted files, after extraction. The command-to-run-after-extraction need not be a .NET executable, but it could be. Of course, since the exe and its config file have been extracted, the exe can run successfully, with access to the .config file. This should meet your requirements.
In code using DotNetZip to produce an SFX that runs a post-extract command looks like this:
string DirectoryPath = "c:\\Documents\\Project7";
using (ZipFile zip = new ZipFile())
{
zip.AddDirectory(DirectoryPath, System.IO.Path.GetFileName(DirectoryPath));
zip.Comment = "This will be embedded into a self-extracting console-based exe";
SelfExtractorOptions options = new SelfExtractorOptions();
options.Flavor = SelfExtractorFlavor.ConsoleApplication;
options.DefaultExtractDirectory = "%USERPROFILE%\\ExtractHere";
options.PostExtractCommandLine = "%USERPROFILE%\\ExtractHere\\MyApp.exe";
options.RemoveUnpackedFilesAfterExecute = true;
zip.SaveSelfExtractor("archive.exe", options);
}
DotNetZip is free to use.