Utilities/ConvertTo-PSCustomObjectDeep.ps1

function ConvertTo-PSCustomObjectDeep {
    param(
        [Parameter(Mandatory)]
        $InputObject
    )

    switch ($InputObject) {
        { $_ -is [System.Collections.IDictionary] } {
            $out = [pscustomobject]@{}

            foreach ($k in $_.Keys) {
                Add-Member -InputObject $out -NotePropertyName $k -NotePropertyValue (ConvertTo-PSCustomObjectDeep $_[$k])
            }

            return $out
        }
        { $_ -is [System.Collections.IEnumerable] -and $_ -isnot [string] } {
            $list = @(); foreach ($item in $_) { $list += , (ConvertTo-PSCustomObjectDeep $item) }; return $list
        }

        default { 
            return $InputObject 
        }
    }
}