Private/ConvertTo-EgmGroupInfo.ps1

function ConvertTo-EgmGroupInfo {
    <#
    .SYNOPSIS
        Converts a raw Get-MgUserMemberOf directory object into a classified group record.
    #>

    [CmdletBinding()]
    param(
        [Parameter(Mandatory, ValueFromPipeline)]
        [object]$DirectoryObject
    )
    process {
        $p = $DirectoryObject.AdditionalProperties
        if ($p['@odata.type'] -ne '#microsoft.graph.group') { return }

        $groupTypes = @($p['groupTypes'])
        $isDynamic  = $groupTypes -contains 'DynamicMembership'
        $isUnified  = $groupTypes -contains 'Unified'
        $mail       = [bool]$p['mailEnabled']
        $sec        = [bool]$p['securityEnabled']
        $onPrem     = [bool]$p['onPremisesSyncEnabled']

        $kind = if ($isUnified)          { 'M365 group' }
                elseif ($mail -and $sec) { 'Mail-enabled security' }
                elseif ($mail)           { 'Distribution list' }
                else                     { 'Security group' }

        # Dynamic and on-prem-synced memberships cannot be written in the cloud;
        # distribution lists and mail-enabled security groups only via Exchange Online.
        $route = if ($isDynamic)                     { 'SkipDynamic' }
                 elseif ($onPrem)                    { 'SkipOnPrem' }
                 elseif ($mail -and -not $isUnified) { 'Exchange' }
                 else                                { 'Graph' }

        [pscustomobject]@{
            Id           = $DirectoryObject.Id
            Name         = [string]$p['displayName']
            Kind         = $kind
            Route        = $route
            IsDynamic    = $isDynamic
            OnPremSynced = $onPrem
        }
    }
}