Creating a custom project settings page is pretty easy, if you don't want to inherit from UDeveloperSettings and use the automatic registration process.

Create a UObject derived class like the following:

UCLASS(config = Input, defaultconfig)
class MYPROJECT_API USomeSettingClass
	: public UObject
{
	GENERATED_BODY()
public:
	//Your uproperties here
};

In your Editor module's StartupModule override, put the following code:

ISettingsModule* SettingsModule = FModuleManager::GetModulePtr<ISettingsModule>("Settings");

if (SettingsModule != nullptr)
{
    TSharedPtr<ISettingsSection> SettingsSection = 
        SettingsModule->RegisterSettings("Project", "Project", "Input", 
            FText::FromString("Input"), 
            FText::FromString("Maps Input IDs to Axis Names"), 
            GetMutableDefault<UInputIDMapping>());

    if (SettingsSection.IsValid()) 
    { 
        SettingsSection->OnModified().BindLambda(
            []() { 
                GetMutableDefault<UInputIDMapping>()->SaveConfig(); 
                return true; 
            }
        );
    }
}

Pay particular attention to the call binding a lambda to OnModified() so that we can tell the engine that we should be saving the configuration file out when the settings are changed.

and in the ShutdownModule override, unregister the settings:

ISettingsModule* SettingsModule = FModuleManager::GetModulePtr<ISettingsModule>("Settings");

if (SettingsModule != nullptr)
{
    SettingsModule->UnregisterSettings("Project", "Project", "Input");
}

Unfortunately because the UnregisterSettings call only takes a reference to the entire section it isn't possible to 'merge' in a second settings object into an existing section, without unregistering everything. But this is pretty simple.