Private/ConvertTo-PascalCaseKeys.ps1

function ConvertTo-PascalCaseKeys {
    [CmdletBinding()]
    [OutputType([PSCustomObject])]
    param(
        [Parameter(Mandatory, ValueFromPipeline)]
        [object]$InputObject
    )

    process {
        if ($InputObject -is [System.Collections.IList]) {
            $InputObject | ForEach-Object { ConvertTo-PascalCaseKeys $_ }
            return
        }

        if ($InputObject -isnot [System.Management.Automation.PSObject]) {
            return $InputObject
        }

        $result = [ordered]@{}
        foreach ($prop in $InputObject.PSObject.Properties) {
            $pascalName = ($prop.Name -split '_' | ForEach-Object {
                if ($_) { $_.Substring(0,1).ToUpper() + $_.Substring(1) }
            }) -join ''

            $value = if ($prop.Value -is [System.Management.Automation.PSObject] -or
                         $prop.Value -is [System.Collections.IList]) {
                ConvertTo-PascalCaseKeys $prop.Value
            } else {
                $prop.Value
            }
            $result[$pascalName] = $value
        }
        [PSCustomObject]$result
    }
}