private/Controls/Get-IconDynamicParameter.ps1

function Get-IconDynamicParameter {
    <#
    .SYNOPSIS
        Creates a dynamic parameter for icon selection with ValidateSet from CharList.json.
        Any of the public functions that accept an 'Icon' parameter can use this to provide intellisense for valid icon names.
    #>

    [CmdletBinding()]
    param(
        [string]$ParameterName = 'Icon',
        [string]$DefaultValue = $null,
        [bool]$Mandatory = $false
    )

    # Use cached icon dictionary from module context (loaded at import)
    $iconDict = [PsUi.ModuleContext]::Icons
    if ($iconDict -and $iconDict.Count -gt 0) { $iconNames = $iconDict.Keys | Sort-Object }
    else { $iconNames = @('Info', 'Warning', 'Error', 'Question', 'Settings', 'User') }

    # Create the dynamic parameter dictionary and attribute collection
    $paramDictionary     = [System.Management.Automation.RuntimeDefinedParameterDictionary]::new()
    $attributeCollection = [System.Collections.ObjectModel.Collection[System.Attribute]]::new()

    # Parameter attribute
    $paramAttribute           = [System.Management.Automation.ParameterAttribute]::new()
    $paramAttribute.Mandatory = $Mandatory
    $attributeCollection.Add($paramAttribute)

    # ValidateSet attribute with icon names
    if ($iconNames.Count -gt 0) {
        [string[]]$validValues = $iconNames
        $validateSet = [System.Management.Automation.ValidateSetAttribute]::new($validValues)
        $attributeCollection.Add($validateSet)
    }

    $dynParam = [System.Management.Automation.RuntimeDefinedParameter]::new(
        $ParameterName,
        [string],
        $attributeCollection
    )

    if ($DefaultValue) { $dynParam.Value = $DefaultValue }

    $paramDictionary.Add($ParameterName, $dynParam)
    return $paramDictionary
}