Function to class migration: constructor best practice
Having a default value is a good idea.
Also, instead of of using the constructor directly, there is a way to convert from a hash table.
This way only works if the class has a default (no-argument) constructor. (If you define a constructor that takes several arguments, you must also explicitly define a no-argument constructor.)

Enum PxLogType { BlankLine; Header; MilieuCondition }
[Flags()] Enum OutputDestination { Console = 1; File = 2 }

class Alignment {
    [char] $Symbol
    [int] $Location

    [string] ToString() { return "{{Symbol='{0}', Location={1}}}" -f $this.Symbol,$this.Location }
}

class PxLogItem {
    [PxLogType] $Type = 'BlankLine'
    [OutputDestination] $Destination = 'Console'
    [int] $Indent = 0
    [Alignment] $Alignment
    [string] $String = ''
}


You can write as follows.

@(
    New-Object PxLogItem -Property @{ Destination = 'File'; String = 'ABC' }
    [PxLogItem]@{ Indent = 12; String = 'DEF' }
    [PxLogItem]@{ Type = 'Header'; Destination = 'Console,File'; Alignment = @{ Symbol = '#'; Location = 10 }; String = 'GHI' }

) | Format-Table -AutoSize


The result:

     Type   Destination Indent Alignment                 String
     ----   ----------- ------ ---------                 ------
BlankLine          File      0                           ABC   
BlankLine       Console     12                           DEF   
   Header Console, File      0 {Symbol='#', Location=10} GHI


You can also convert strings to objects. This way requires defining a Parse() method.

Enum PxLogType { BlankLine; Header; MilieuCondition }
[Flags()] Enum OutputDestination { Console = 1; File = 2 }

class Alignment {
    [char] $Symbol
    [int] $Location

    [string] ToString() { return "{{Symbol='{0}', Location={1}}}" -f $this.Symbol,$this.Location }
    static [Alignment] Parse($str) { $s,$l = $str.Trim().Split(',', 2); return @{ Symbol = $s; Location = $l } }
}

class PxLogItem {

    [PxLogType] $Type = 'BlankLine'
    [OutputDestination] $Destination = 'Console'
    [int] $Indent = 0
    [Alignment] $Alignment
    [string] $String = ''

    static [PxLogItem] Parse($str) {
        $regex = '^(?:{(?&lt;type&gt;[a-z]+),(?&lt;dest&gt;[cf]+),(?&lt;idt&gt;[0-9]+)(?:,align=(?&lt;align&gt;\S,[0-9]+))?})?(?&lt;text&gt;.*)$'
        if ($str -notmatch $regex) { throw }

        $result = @{ String = $Matches['text'] }
        if ($Matches['type']) {
            $result.Add('Type', $Matches['type'])
            $result.Add('Destination', $Matches['dest'].ToCharArray().ForEach{ "$_" })
            $result.Add('Indent', $Matches['idt'])
        }
        if ($Matches['align']) {
            $result.Add('Alignment', $Matches['align'])
        }
        return $result
    } 
}


All of the following are valid conversions.

@(
    [PxLogItem]@{ Destination = 'Console,File'; Indent = 12; Alignment = '=,15'; String = 'ABC' }
    [PxLogItem]'DEF'
    [PxLogItem]'{m,f,8}GHI'
    [PxLogItem]'{header,cf,4,align=#,10}JKL'

) | Format-Table -AutoSize


The result:

           Type   Destination Indent Alignment                 String
           ----   ----------- ------ ---------                 ------
      BlankLine Console, File     12 {Symbol='=', Location=15} ABC   
      BlankLine       Console      0                           DEF   
MilieuCondition          File      8                           GHI   
         Header Console, File      4 {Symbol='#', Location=10} JKL


Using functions makes them more readable.

function New-PxLogItem {

    Param(
        [Parameter(Mandatory, Position=0)]
        [string]
        $String = '',

        [Parameter(Position=1)]
        [PxLogType]
        $Type = 'BlankLine',

        [Parameter(Position=2)]
        [ValidateRange(0,1000)]
        [int]
        $Indent = 0,

        [Parameter(Position=3)]
        [Alignment]
        $Alignment,

        [switch]
        $Console,

        [switch]
        $File
    )

    if (!$Console -and !$File) { $Console = $true }
    $PSBoundParameters.Add('Destination', !!$Console + 2 * !!$File)
    ('Console','File').ForEach{ [void]$PSBoundParameters.Remove($_) }

    [PxLogItem]$PSBoundParameters
}


$item1 = New-PxLogItem "Hello" Header -indent 4 -align "#,10" -c -f