I found the a solution:
The shared schedules are created as SQL agent jobs. The name of the job is the ScheduleID that is associated with the schedule name in the schedule table of the ReportServer database.
In RS create a shared schedule that runs once.
Lookup the scheduleID in the schedule table.
Create an SQL agent job with a schedule that runs the last day of the month
Create a jobstep that execute the 'sp_start_job'
sp_start_job N'ScheduleID' (target database is msdb)
This works even when the status of the shared schedule in RS is 'expired'.
Hope this solution is useful for some of you