One carriage plunged down a steep slope above a river, while another one hung precariously over the edge after the slide, which occurred around 12.45pm on the Rhaetian Railway's Albula line linking Saint Moritz to Chur.
Graubünden cantonal police said 200 people were on the train that derailed between Tiefencastel and Solis.
Five people were seriously injured and six others suffered minor injuries, according to initial findings, police said.
Investigators identified two of those injured as Japanese citizens, while another was Australian and the rest were Swiss.
There were no fatalities.
Three of the eight carriages derailed, including one that was stopped from dropping into a flood-swollen river by trees.
"The train made an emergency stop out of nowhere," a passenger in the second carriage behind the locomotive told the 20 Minuten newspaper.
Part of the carriage dangled over the side of the rails.
"We all went in the back of the carriage so that it wouldn't crash," the passenger told the daily.
The accident occurred above the Schin canyon but none of the carriages fell into the river below.
"There was a guardian angel travelling on that train," Stefan Engeler, head of Rhaetian Railway, told the Swiss news agency SDA, referring to the fact that all passengers were rescued.
Police issued a statement at 3pm saying that a rescue process was still under way, with Rega emergency rescue helicopters and ambulances on site.
Paramedics were looking after passengers in shock, the statement said.
The Blick newspaper reported that four helicopters, eight ambulances and 60 fire fighters came to the site, along with paramedics and police officers.
All passengers aboard the train were safely evacuated, 20 Minuten reported about four hours after the derailment.
Uninjured passengers were taken to the Tiefencastel train station, where they were cared for and fed, police said in an updated statement.
They were transported on to their destinations by bus, the statement said.
The accident came after six passengers were injured in a crash elsewhere in Graubünden on Tuesday night when a trailer-truck sideswiped a Swiss Post bus on the A13 motorway between Sufers and Spilligen, cantonal police said on Wednesday.
The injured bus passengers were transported by ambulance to hospital for treatment.
Rhaetian Railway train on Albula line. Photo: Clara66/Wikimedia Commons